bitkeeper revision 1.1201 (42108e93jNjU6R-4pZQGJCtUzl_HkQ)
authorkaf24@scramble.cl.cam.ac.uk <kaf24@scramble.cl.cam.ac.uk>
Mon, 14 Feb 2005 11:42:11 +0000 (11:42 +0000)
committerkaf24@scramble.cl.cam.ac.uk <kaf24@scramble.cl.cam.ac.uk>
Mon, 14 Feb 2005 11:42:11 +0000 (11:42 +0000)
Fix SMP booting. Clean up x86/64 a bit.
Signed-off-by: keir.fraser@cl.cam.ac.uk
xen/arch/x86/domain.c
xen/arch/x86/smpboot.c
xen/arch/x86/x86_64/entry.S
xen/drivers/char/console.c
xen/include/asm-x86/shadow.h

index 7e9b9bd7632c42b73a830a5f737d0bce2a42858b..1b02b0792103acf3d6dad4dad140353e12c10a54 100644 (file)
@@ -541,6 +541,14 @@ void new_thread(struct exec_domain *d,
 
 #ifdef __x86_64__
 
+void toggle_guest_mode(struct exec_domain *ed)
+{
+    ed->arch.flags ^= TF_kernel_mode;
+    __asm__ __volatile__ ( "swapgs" );
+    update_pagetables(ed);
+    write_ptbase(ed);
+}
+
 #define loadsegment(seg,value) ({               \
     int __r = 1;                                \
     __asm__ __volatile__ (                      \
@@ -655,12 +663,7 @@ static void switch_segments(
         }
 
         if ( !(n->arch.flags & TF_kernel_mode) )
-        {
-            n->arch.flags |= TF_kernel_mode;
-            __asm__ __volatile__ ( "swapgs" );
-            update_pagetables(n);
-            write_ptbase(n);
-        }
+            toggle_guest_mode(n);
 
         regs->entry_vector  = TRAP_syscall;
         regs->rflags       &= 0xFFFCBEFFUL;
@@ -681,10 +684,7 @@ long do_switch_to_user(void)
          unlikely(pagetable_val(ed->arch.guest_table_user) == 0) )
         return -EFAULT;
 
-    ed->arch.flags &= ~TF_kernel_mode;
-    __asm__ __volatile__ ( "swapgs" );
-    update_pagetables(ed);
-    write_ptbase(ed);
+    toggle_guest_mode(ed);
 
     regs->rip    = stu.rip;
     regs->cs     = stu.cs;
index 00838ecce2d4cdf63d4c5c6f415b7cd106892f00..46a780a6baa3736d3966cd033e03f510bf4cdaef 100644 (file)
@@ -668,7 +668,7 @@ static void __init do_boot_cpu (int apicid)
 
     set_bit(DF_IDLETASK, &idle->d_flags);
 
-    ed->arch.guest_table = mk_pagetable(__pa(idle_pg_table));
+    ed->arch.monitor_table = mk_pagetable(__pa(idle_pg_table));
 
     map_cpu_to_boot_apicid(cpu, apicid);
 
index feb7ec342b67015ebde148cd34da3cb488e3187b..c957c1b19bfae674593c7bd9489fc2bcab206620 100644 (file)
@@ -19,6 +19,7 @@
         movq (reg),reg;
 
         ALIGN
+/* %rbx: struct exec_domain */
 restore_all_guest:
         btr   $_TF_failsafe_return,EDOMAIN_thread_flags(%rbx)
         jc    failsafe_callback
@@ -37,9 +38,11 @@ restore_all_guest:
 1:      sysretl
 
         ALIGN
+/* No special register assumptions. */
 iret_exit_to_guest:
         addq  $8,%rsp
 FLT1:   iretq
+
 .section .fixup,"ax"
 FIX1:   popq  -15*8-8(%rsp)            # error_code/entry_vector
         SAVE_ALL                       # 15*8 bytes pushed
@@ -79,6 +82,7 @@ failsafe_callback:
         RESTORE_ALL
         addq $8,%rsp
 FLT2:   iret 
+
 .section .fixup,"ax"
 FIX2:   pushq %rbx
         GET_CURRENT(%rbx)
@@ -91,6 +95,7 @@ FIX2:   pushq %rbx
 .previous
 
         ALIGN
+/* No special register assumptions. */
 restore_all_xen:
         RESTORE_ALL
         addq  $8,%rsp
@@ -130,6 +135,7 @@ ENTRY(syscall_enter)
         pushq restore_all_guest(%rip)
         jmp   create_bounce_frame
 
+/* %rbx: struct exec_domain */
 hypercall:
         sti
         movq  %r10,%rcx
@@ -138,6 +144,7 @@ hypercall:
         callq *(%r10,%rax,8)
         movq %rax,XREGS_rax(%rsp)       # save the return value
 
+/* %rbx: struct exec_domain */
 test_all_events:
         cli                             # tests must not race interrupts
 /*test_softirqs:*/  
@@ -163,6 +170,7 @@ test_all_events:
         jmp   restore_all_guest
 
         ALIGN
+/* %rbx: struct exec_domain */
 process_softirqs:
         sti       
         call SYMBOL_NAME(do_softirq)
@@ -170,8 +178,8 @@ process_softirqs:
                 
 /* CREATE A BASIC EXCEPTION FRAME ON GUEST OS STACK:                     */
 /*   { RCX, R11, [DS-GS,] [CR2,] [ERRCODE,] RIP, CS, RFLAGS, RSP, SS }   */
-/* %rdx == trap_bounce, %rbx == task_struct                              */
-/* %rax,%rcx are clobbered. %rsi contains new XREGS_rsp.                 */
+/* %rdx: trap_bounce, %rbx: struct exec_domain                           */
+/* On return only %rbx is guaranteed non-clobbered.                      */
 create_bounce_frame:
         /* Push new frame at existing %rsp if already in guest-OS mode. */
         movq  XREGS_rsp+8(%rsp),%rsi
@@ -225,19 +233,16 @@ FLT14:  movq  %rax,(%rsi)               # R11
 FLT15:  movq  %rax,(%rsi)               # RCX
         /* Rewrite our stack frame and return to guest-OS mode. */
         /* IA32 Ref. Vol. 3: TF, VM, RF and NT flags are cleared on trap. */
-        movb  $0,TRAPBOUNCE_flags(%rdx)
-        bts   $_TF_kernel_mode,EDOMAIN_thread_flags(%rbx)
-        jc    1f
-        swapgs
-        movq  %rbx,%rdi
-        call  SYMBOL_NAME(write_ptbase)
-1:      movl  $TRAP_syscall,XREGS_entry_vector+8(%rsp)
+        movl  $TRAP_syscall,XREGS_entry_vector+8(%rsp)
         andl  $0xfffcbeff,XREGS_eflags+8(%rsp)
         movl  $__GUEST_SS,XREGS_ss+8(%rsp)
         movq  %rsi,XREGS_rsp+8(%rsp)
         movl  $__GUEST_CS,XREGS_cs+8(%rsp)
         movq  TRAPBOUNCE_eip(%rdx),%rax
         movq  %rax,XREGS_rip+8(%rsp)
+        movb  $0,TRAPBOUNCE_flags(%rdx)
+        testb $TF_kernel_mode,EDOMAIN_thread_flags(%rbx)
+        jz    SYMBOL_NAME(toggle_guest_mode)
         ret
 .section .fixup,"ax"
 FIX3:   sti
@@ -264,6 +269,7 @@ DBLFLT2:jmp   process_guest_exception_and_events
 .previous
 
         ALIGN
+/* %rbx: struct exec_domain */
 process_guest_exception_and_events:
         leaq  EDOMAIN_trap_bounce(%rbx),%rdx
         testb $TBF_EXCEPTION,TRAPBOUNCE_flags(%rdx)
@@ -273,6 +279,7 @@ process_guest_exception_and_events:
         jmp   test_all_events
 
         ALIGN
+/* No special register assumptions. */
 ENTRY(ret_from_intr)
         GET_CURRENT(%rbx)
         testb $3,XREGS_cs(%rsp)
@@ -280,6 +287,7 @@ ENTRY(ret_from_intr)
         jmp   restore_all_xen
 
         ALIGN
+/* No special register assumptions. */
 error_code:
         SAVE_ALL
         testb $X86_EFLAGS_IF>>8,XREGS_eflags+1(%rsp)
@@ -294,6 +302,7 @@ error_code:
         jz    restore_all_xen
         jmp   process_guest_exception_and_events
 
+/* No special register assumptions. */
 exception_with_ints_disabled:
         testb $3,XREGS_cs(%rsp)         # interrupts disabled outside Xen?
         jnz   1b                        # it really does happen!
@@ -315,6 +324,7 @@ exception_with_ints_disabled:
         movq  %rax,XREGS_kernel_sizeof(%rsp)
         jmp   restore_all_xen           # return to fixup code
 
+/* No special register assumptions. */
 FATAL_exception_with_ints_disabled:
         movl  XREGS_entry_vector(%rsp),%edi
         movq  %rsp,%rsi
index 00f2223f7775e26bfc79de33b4e6e70965204e75..9ddfa2e90a0f89d84712246c9f4804c9498939fc 100644 (file)
@@ -553,6 +553,8 @@ static int __init debugtrace_init(void)
     debugtrace_buf = (unsigned char *)alloc_xenheap_pages(order);
     ASSERT(debugtrace_buf != NULL);
 
+    memset(debugtrace_buf, '\0', debugtrace_bytes);
+
     return 0;
 }
 __initcall(debugtrace_init);
index 190ffe1669fd04ea712c3d871fd6afd3fcc64d98..3f6f273de3e9ecd884b9a0c1c627502f84c09528 100644 (file)
@@ -739,11 +739,8 @@ static inline void __update_pagetables(struct exec_domain *ed)
     if ( unlikely(smfn == 0) )
         smfn = shadow_l2_table(d, gpfn);
 #ifdef CONFIG_VMX
-    else
-        if (shadow_mode_translate(ed->domain) )
-        {
-            vmx_update_shadow_state(ed, gpfn, smfn);
-        }
+    else if ( shadow_mode_translate(ed->domain) )
+        vmx_update_shadow_state(ed, gpfn, smfn);
 #endif
 
     ed->arch.shadow_table = mk_pagetable(smfn<<PAGE_SHIFT);
@@ -756,28 +753,16 @@ static inline void update_pagetables(struct exec_domain *ed)
 {
      if ( unlikely(shadow_mode_enabled(ed->domain)) )
      {
-         SH_VVLOG("update_pagetables( gptbase=%p, mode=%d )",
-             pagetable_val(ed->arch.guest_table),
-                  shadow_mode(ed->domain)); 
-
          shadow_lock(ed->domain);
          __update_pagetables(ed);
          shadow_unlock(ed->domain);
-
-         SH_VVLOG("leaving update_pagetables:\n"
-                  "( gptbase=%p, mode=%d ) sh=%p",
-                  pagetable_val(ed->arch.guest_table),
-                  shadow_mode(ed->domain), 
-                  pagetable_val(ed->arch.shadow_table) );
      }
-     else
 #ifdef __x86_64__
-         if ( !(ed->arch.flags & TF_kernel_mode) )
-             ed->arch.monitor_table = ed->arch.guest_table_user;
-         else
+     else if ( !(ed->arch.flags & TF_kernel_mode) )
+         ed->arch.monitor_table = ed->arch.guest_table_user;
 #endif
-             ed->arch.monitor_table = ed->arch.guest_table;
-
+     else
+         ed->arch.monitor_table = ed->arch.guest_table;
 }
 
 #if SHADOW_DEBUG